package com.example.service;

import com.example.domain.dto.cart.*;

/**
 * 购物车服务接口
 * 
 * @author Means
 * @since 2025-10-27
 */
public interface CartService {
    
    // ==================== 购物车管理 ====================
    
    /**
     * 获取或创建购物车
     * 根据用户ID或会话ID获取活跃购物车，不存在则创建新购物车
     * 
     * @param userId 用户ID（可选）
     * @param sessionId 会话ID（必填）
     * @return 购物车DTO
     */
    CartDTO getOrCreateCart(String userId, String sessionId);
    
    /**
     * 根据ID获取购物车详情
     * 
     * @param cartId 购物车ID
     * @return 购物车DTO
     */
    CartDTO getCartById(String cartId);
    
    /**
     * 根据用户获取活跃购物车
     * 
     * @param userId 用户ID
     * @return 购物车DTO，不存在返回null
     */
    CartDTO getActiveCartByUser(String userId);
    
    /**
     * 清空购物车
     * 
     * @param cartId 购物车ID
     */
    void clearCart(String cartId);
    
    
    // ==================== 购物车商品管理 ====================
    
    /**
     * 添加商品到购物车
     * 
     * @param cartId 购物车ID
     * @param request 添加商品请求
     * @return 更新后的购物车DTO
     */
    CartDTO addItemToCart(String cartId, AddToCartRequest request);
    
    /**
     * 更新购物车商品数量
     * 
     * @param cartItemId 购物车商品ID
     * @param request 更新请求
     * @return 更新后的购物车DTO
     */
    CartDTO updateCartItem(String cartItemId, UpdateCartItemRequest request);
    
    /**
     * 从购物车删除商品
     * 
     * @param cartItemId 购物车商品ID
     * @return 更新后的购物车DTO
     */
    CartDTO removeItemFromCart(String cartItemId);
    
    
    
    // ==================== 购物车计算 ====================
    
    /**
     * 重新计算购物车金额
     * 包括商品小计、折扣、应付总额
     * 
     * @param cartId 购物车ID
     * @return 更新后的购物车DTO
     */
    CartDTO recalculateCart(String cartId);
    
    /**
     * 获取购物车商品数量
     * 
     * @param cartId 购物车ID
     * @return 商品数量
     */
    int getCartItemCount(String cartId);
    
    /**
     * 检查购物车是否为空
     * 
     * @param cartId 购物车ID
     * @return 是否为空
     */
    boolean isCartEmpty(String cartId);
    
}

